package com.tangsm.spring.boot.strategy.controller;

import com.tangsm.spring.boot.strategy.pay.context.PayContext;
import com.tangsm.spring.boot.strategy.pay.enums.PayStrategyEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;

/**
 * Java 枚举实现策略模式测试服务接口
 *
 * @author tangsm
 */
@RestController
@RequestMapping("/java/enum")
public class JavaEnumsController {
    @Autowired
    private PayContext payContext;

    /**
     * 阿里支付
     *
     * @param amount 支付金额
     * @return 响应结果
     */
    @GetMapping("/ali/{amount}")
    public String aliPay(@PathVariable(name = "amount") BigDecimal amount) {
        return payContext.pay(PayStrategyEnum.ALI.getType(), amount);
    }

    /**
     * 微信支付
     *
     * @param amount 支付金额
     * @return 响应结果
     */
    @GetMapping("/wx/{amount}")
    public String wxPay(@PathVariable(name = "amount") BigDecimal amount) {
        return payContext.pay(PayStrategyEnum.WX.getType(), amount);
    }

    /**
     * 华为支付
     *
     * @param amount 支付金额
     * @return 响应结果
     */
    @GetMapping("/hw/{amount}")
    public String hwPay(@PathVariable(name = "amount") BigDecimal amount) {
        return payContext.pay(PayStrategyEnum.HW.getType(), amount);
    }

    /**
     * 银联支付
     *
     * @param amount 支付金额
     * @return 响应结果
     */
    @GetMapping("/union/{amount}")
    public String unionPay(@PathVariable(name = "amount") BigDecimal amount) {
        return payContext.pay(PayStrategyEnum.UNION.getType(), amount);
    }

    /**
     * 自定义支付
     *
     * @param type   支付类型
     * @param amount 支付金额
     * @return 响应结果
     */
    @GetMapping("/custom/{type}/{amount}")
    public String customPay(@PathVariable(name = "type") String type, @PathVariable(name = "amount") BigDecimal amount) {
        return payContext.pay(type, amount);
    }
}
